#ifndef __TELEPHONEBOOK_H_
#define __TELEPHONEBOOK_H_

#include <stdbool.h>

typedef void *ElementType; // 通用化，不把类型写死

// 联系人信息结构体
struct ContactsInfo
{
    char *name;
    char *phone;
};
typedef struct ContactsInfo ContInfo;

// 通讯录结构体
struct TelephoneBook
{
    ElementType *contacts;        // 指向动态数组的指针， 存储联系人信息
    int capacity;                 // 动态数组的容量
    int size;                     // 当前存储的联系人数量
    void (*FreePtr)(ElementType); // 释放函数的函数指针
};
typedef struct TelephoneBook TelBook;

// 创建通讯录
TelBook *InitTelBook(int capacity, void (*FreePtr)(ElementType));

// 释放通讯录
void FreeTelBook(TelBook *book);

// 插入联系人
bool InsertCont(TelBook *book, const char *name, const char *phone);

// 按名字删除联系人
bool DeleteByName(TelBook *book, const char *name);

// 按电话删除联系人
bool DeleteByPhone(TelBook *book, const char *phone);

// 修改联系人信息
bool ModifyContact(TelBook *book, const char *oldName, const char *newName, const char *newPhone);

// 按名字模糊查询
void SearchByName(TelBook *book, const char *subString);

// 按电话模糊查询
void SearchByPhone(TelBook *book, const char *subString);

// 显示所有联系人信息
void Show(TelBook *book);

// 快速排序
void TelBookFastSort(TelBook *book, bool (*SortPtr)(ElementType, ElementType));

// 二分查找
ElementType BinarySearch(TelBook *book, ElementType element, int (*BSearch)(ElementType, ElementType));

// 保存通讯录到本地文件
void SaveBook(TelBook *book, char *(*GetInfo)(void *));
char *GetInfo(void *ptr);

// 读取文件中的内容
void ReadFromBook(TelBook *book);
void *Create(char *name, char *phone);

#endif